home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr46 / vfwdk.zip / VFWSDK.ZIP / SAMPLES / BRAVADO / CONFIG.C < prev    next >
C/C++ Source or Header  |  1993-01-31  |  42KB  |  1,191 lines

  1. /****************************************************************************
  2.  *
  3.  *   config.c
  4.  * 
  5.  *   Dialog Box processing
  6.  *
  7.  *   Microsoft Video for Windows Sample Capture Driver
  8.  *   Chips & Technologies 9001 based frame grabbers.
  9.  *
  10.  *   Copyright (c) 1992-1993 Microsoft Corporation.  All Rights Reserved.
  11.  *
  12.  *    You have a royalty-free right to use, modify, reproduce and 
  13.  *    distribute the Sample Files (and/or any modified version) in 
  14.  *    any way you find useful, provided that you agree that 
  15.  *    Microsoft has no warranty obligations or liability for any 
  16.  *    Sample Application Files which are modified. 
  17.  *
  18.  ***************************************************************************/
  19.  
  20. #include <windows.h>
  21. #include <mmsystem.h>
  22. #include <stdlib.h>
  23. #include <msvideo.h>
  24. #include <msviddrv.h>
  25. #include "ct.h"
  26. #include "ctdev.h"      // Device specific include
  27. #include "config.h"
  28. #include "ver.h"
  29.  
  30. #define WIDTHBYTES(i)     ((unsigned)((i+31)&(~31))/8)  /* ULONG aligned ! */
  31. #define WM_UPDATEDIALOG         (WM_USER+200)
  32.  
  33. typedef struct tagVS_VERSION
  34. {
  35.     WORD wTotLen;
  36.     WORD wValLen;
  37.     char szSig[16];
  38.     VS_FIXEDFILEINFO vffInfo;
  39. } VS_VERSION;
  40.  
  41. typedef struct tagLANGANDCP
  42. {
  43.     WORD wLanguage;
  44.     WORD wCodePage;
  45. } LANGANDCP;
  46.  
  47. static WORD wTmpVideoFormat;
  48. static WORD wTmpSize40;         // legal range is 1 to 40 (= 40 to 640)
  49.  
  50. static int iTmpHue;             // might be decremented to -1
  51. static int iTmpSat;
  52. static int iTmpContrast;
  53. static int iTmpBrightness;
  54. static int iTmpRed;
  55. static int iTmpGreen;
  56. static int iTmpBlue;
  57.  
  58. static WORD wTmpSourceConnector;        // 0-3
  59. static WORD wTmpVideoStandard;          // 0 = NTSC, 1 = PAL
  60. static WORD wTmpVideoCableFormat;       // 0 = Composite, 1 = SVideo
  61.  
  62. static int  gwHue;
  63. static int  gwSat;
  64. static int  gwContrast;
  65. static int  gwBrightness;
  66. static int  gwRed;
  67. static int  gwGreen;
  68. static int  gwBlue;
  69. static int  gwVideoStandard;
  70. static WORD gwVideoCableFormat;         // 0 = Composite, 1 = SVideo
  71.  
  72. /***************************************************************************
  73.     The following are used both to load the config dialog list boxes,
  74.     but also to confirm INI values.
  75. ***************************************************************************/
  76.  
  77. #ifdef _VBLASTER
  78. // This will be replaced with the values returned by vbcGetPortAddress
  79. COMBOBOX_ENTRY BCODE gwPortBaseOptions [] = 
  80. {
  81.        0x2AD6, "0x2AD6        "         // Leave the spaces for wsprintf!
  82. };
  83. #define N_PORTBASEOPTIONS (sizeof (gwPortBaseOptions) / sizeof (COMBOBOX_ENTRY))
  84.  
  85. COMBOBOX_ENTRY  gwInterruptOptions [] = 
  86. {
  87.        5, "5",
  88.        10, "10",
  89.        11, "11",
  90.        12, "12"
  91. };
  92. #define N_INTERRUPTOPTIONS (sizeof (gwInterruptOptions) / sizeof (COMBOBOX_ENTRY))
  93. #endif // _VBLASTER specific
  94.  
  95. /* ------------------------------------------------------- */
  96. #ifdef _BRAVADO
  97.  
  98. COMBOBOX_ENTRY BCODE gwPortBaseOptions [] = 
  99. {
  100.        0x204, "0x204",
  101.        0x214, "0x214",
  102.        0x224, "0x224 (Default)",
  103.        0x234, "0x234",
  104.        0x304, "0x304",
  105.        0x314, "0x314",
  106.        0x3A4, "0x3A4"
  107. };
  108. #define N_PORTBASEOPTIONS (sizeof (gwPortBaseOptions) / sizeof (COMBOBOX_ENTRY))
  109.  
  110. COMBOBOX_ENTRY  gwInterruptOptions [] = 
  111. {
  112.        9, "9"
  113. };
  114. #define N_INTERRUPTOPTIONS (sizeof (gwInterruptOptions) / sizeof (COMBOBOX_ENTRY))
  115. #endif // BRAVADO specific
  116.  
  117. COMBOBOX_ENTRY  gwMemoryBaseOptions [] = 
  118. {
  119.        0x02, "2 Meg  (0x200000)",
  120.        0x03, "3 Meg  (0x300000)",
  121.        0x04, "4 Meg  (0x400000)",
  122.        0x05, "5 Meg  (0x500000)",
  123.        0x06, "6 Meg  (0x600000)",
  124.        0x07, "7 Meg  (0x700000)",
  125.        0x08, "8 Meg  (0x800000)",
  126.        0x09, "9 Meg  (0x900000)",
  127.        0x0a, "10 Meg (0xA00000)",
  128.        0x0b, "11 Meg (0xB00000)",
  129.        0x0c, "12 Meg (0xC00000)",
  130.        0x0d, "13 Meg (0xD00000)",
  131.        0x0e, "14 Meg (0xE00000)",
  132.        0x0f, "15 Meg (0xF00000)"
  133. };
  134. #define N_MEMORYBASEOPTIONS (sizeof (gwMemoryBaseOptions) / sizeof (COMBOBOX_ENTRY))
  135.  
  136.  
  137. static COMBOBOX_ENTRY  gwSizeOptions [] = 
  138. {
  139.        1,        "40 x 30",
  140.        2,        "80 x 60",
  141.        3,        "120 x 90",
  142.        4,        "160 x 120",
  143.        5,        "200 x 150",
  144.        6,        "240 x 180",
  145.        7,        "280 x 210",
  146.        8,        "320 x 240",
  147.        9,        "360 x 270",
  148.        10,        "400 x 300",
  149.        11,        "440 x 330",
  150.        12,        "480 x 360",
  151.        13,        "520 x 390",
  152.        14,        "560 x 420",
  153.        15,        "600 x 450",
  154.        16,        "640 x 480"
  155. };                      
  156. #define N_SIZEOPTIONS (sizeof (gwSizeOptions) / sizeof (COMBOBOX_ENTRY))
  157.  
  158. static COMBOBOX_ENTRY  gwFormatOptions [] = 
  159. {
  160.        IMAGE_FORMAT_PAL8,            "8 bit Palettized",
  161.        IMAGE_FORMAT_RGB16,        "16 bit RGB",
  162.        IMAGE_FORMAT_RGB24,        "24 bit RGB"
  163. #if DEBUG
  164.        , IMAGE_FORMAT_YUV411UNPACKED,    "YUV 411 (Unpacked)"
  165. #endif
  166. };
  167. #define N_FORMATOPTIONS (sizeof (gwFormatOptions) / sizeof (COMBOBOX_ENTRY))
  168.  
  169.  
  170. //
  171. // This initalizes the destination BitmapInfo header
  172. //
  173. void FAR PASCAL InitDestBIHeader (LPBITMAPINFOHEADER lpbi, 
  174.                 WORD wEnumFormat,  WORD wWidth)
  175. {
  176.     lpbi->biSize          = sizeof (BITMAPINFOHEADER);
  177.     lpbi->biWidth         = wWidth;
  178.     lpbi->biHeight        = (lpbi->biWidth * 3) / 4;
  179.     lpbi->biPlanes        = 1;
  180.     lpbi->biXPelsPerMeter = 0L;
  181.     lpbi->biYPelsPerMeter = 0L;
  182.     lpbi->biClrUsed       = 0L;
  183.     lpbi->biClrImportant  = 0L;
  184.  
  185.     switch (wEnumFormat) {
  186.         case IMAGE_FORMAT_PAL8:  
  187.             lpbi->biBitCount = 8; 
  188.             lpbi->biCompression = BI_RGB;
  189.             break;
  190.         case IMAGE_FORMAT_RGB16:
  191.             lpbi->biBitCount = 16; 
  192.             lpbi->biCompression = BI_RGB;
  193.             break;
  194.         case IMAGE_FORMAT_RGB24:
  195.             lpbi->biBitCount = 24; 
  196.             lpbi->biCompression = BI_RGB;
  197.             break;
  198.         case IMAGE_FORMAT_YUV411PACKED:
  199.             lpbi->biBitCount = 16;      
  200.             lpbi->biCompression = ckidYUV411Packed;  
  201.             break;
  202.         case IMAGE_FORMAT_YUV411UNPACKED:
  203.             lpbi->biBitCount = 16; 
  204.             lpbi->biCompression = ckidYUV411Unpacked;
  205.             break;
  206.     }
  207.     if (lpbi->biCompression == BI_RGB)
  208.         lpbi->biSizeImage     = (DWORD)biDest.biHeight * 
  209.                 (DWORD)WIDTHBYTES(biDest.biWidth * biDest.biBitCount);
  210.     else {
  211.         lpbi->biSizeImage     = (DWORD)biDest.biHeight * 
  212.                 (DWORD)WIDTHBYTES(biDest.biWidth * biDest.biBitCount);
  213.     }
  214. }
  215.  
  216. //
  217. // Initalizes all state variables.  Called once at startup.
  218. //
  219. BOOL FAR PASCAL ConfigInit (LPDEVICE_INIT lpDI)
  220. {
  221.     // Set Hue, Contrast, Zoom, etc.
  222.     CT_SetColor (CT_COLOR_HUE, gwHue);
  223.     CT_SetColor (CT_COLOR_SAT, gwSat);
  224.     CT_SetColor (CT_COLOR_BRIGHTNESS, gwBrightness);
  225.     CT_SetColor (CT_COLOR_CONTRAST, gwContrast);
  226.     CT_SetColor (CT_COLOR_RED, gwRed);
  227.     CT_SetColor (CT_COLOR_GREEN, gwGreen);
  228.     CT_SetColor (CT_COLOR_BLUE, gwBlue);
  229.     CT_SetVideoSource (gwSourceConnector);
  230.     CT_SetVideoStandard (gwVideoStandard);
  231.     CT_SetVideoCableFormat (gwVideoCableFormat);
  232.  
  233.     gfEurope = gwVideoStandard != 0;
  234.  
  235.     // The following constant is never changed
  236.     gwWidthBytes = 2048;        // Width of a line in the frame buffer
  237.         
  238.     // New way
  239.     biSource.biSize          = sizeof (BITMAPINFOHEADER);
  240.     biSource.biWidth         = 720;
  241.     biSource.biHeight        = 480;
  242.     biSource.biPlanes        = 1;
  243.     biSource.biBitCount      = 8;
  244.     biSource.biCompression   = BI_RGB;
  245.     biSource.biSizeImage     = 
  246.         WIDTHBYTES(biSource.biWidth * biSource.biBitCount) 
  247.         * biSource.biHeight;
  248.     biSource.biXPelsPerMeter = 0L;
  249.     biSource.biYPelsPerMeter = 0L;
  250.     biSource.biClrUsed       = 0L;
  251.     biSource.biClrImportant  = 0L;
  252.  
  253.     SetSourceFormat(&biSource, sizeof (biSource));
  254.  
  255.     InitDestBIHeader (&biDest, gwDestFormat, gwSize40 * 40);
  256.  
  257.     // Try to set the format using the last saved configuration
  258.     if (SetDestFormat (&biDest, sizeof (biDest))) {
  259.         // Initialization failed, try again using minimum sizes
  260.         InitDestBIHeader (&biDest, IMAGE_FORMAT_PAL8, 1 * 40);
  261.         if (SetDestFormat (&biDest, sizeof (biDest)))
  262.             return FALSE;
  263.     }
  264.     return TRUE;
  265. }
  266.  
  267. //
  268. // Get a profile hex value.
  269. // Returns the profile value or the default if none is present.
  270. //
  271. WORD FAR PASCAL GetProfileHex(LPSTR szApp, LPSTR szEntry, WORD wDef)
  272. {
  273.     BYTE  buf[20];
  274.     WORD  n;
  275.     BYTE  b;
  276.     int   i;
  277.  
  278.     n = GetPrivateProfileString(szApp, szEntry, gszNULL, buf, sizeof(buf), gszIniFile);
  279.     if (n < 1) return wDef;
  280.  
  281.     for (n=0,i=0; b=buf[i]; i++) {
  282.         if (b > 'Z') b -= 'a' - 'A';
  283.         b -= '0';
  284.         if (b > 9) b -= 7;
  285.         if (b > 15)
  286.             break;
  287.         n = n * 16 + b;
  288.     }
  289.     return n;
  290. }
  291.  
  292. //
  293. // Returns values set by config dialog from SYSTEM.INI
  294. //
  295. int FAR PASCAL GetHardwareSettingsFromINI( LPDEVICE_INIT lpDI )
  296. {
  297.     lpDI->bInterrupt = (BYTE)GetPrivateProfileInt(gszDriverName, gszIntKey, 10, gszIniFile);
  298.     lpDI->wSegment   = GetProfileHex(gszDriverName, gszMemoryKey, 0x0e );
  299.  
  300.     // The BasePort is trouble.  For the Bravado, we can set it anytime.
  301.     // So it is stored in SYSTEM.INI
  302.     // For the VBlaster, we ask the driver how it was previously setup,
  303.     // (by VBSETENV.EXE) which was saved in AUTOEXEC.BAT
  304. #ifdef _BRAVADO
  305.     lpDI->wIOBase    = GetProfileHex(gszDriverName, gszPortKey, CT_DEFAULT_IOBASE );
  306. #endif
  307. #ifdef _VBLASTER
  308.     lpDI->wIOBase    = CT_GetPortAddress ();
  309. #endif
  310.     return 1;
  311. }
  312.  
  313. //
  314. // Saves settings from Config dialog into INI file
  315. //
  316. int FAR PASCAL PutHardwareSettingsToINI( LPDEVICE_INIT lpDI )
  317. {
  318.     char buf[64];
  319.  
  320.     wsprintf(buf, gszIntFormat, lpDI->bInterrupt);
  321.     WritePrivateProfileString(gszDriverName, gszIntKey, buf, gszIniFile);
  322.     wsprintf(buf, gszHexFormat, lpDI->wSegment);
  323.     WritePrivateProfileString(gszDriverName, gszMemoryKey, buf, gszIniFile);
  324.     wsprintf(buf, gszHexFormat, lpDI->wIOBase);
  325.     WritePrivateProfileString(gszDriverName, gszPortKey, buf, gszIniFile);
  326.     return 1;
  327. }
  328.  
  329.  
  330. //
  331. // Retrieves settings from INI for everything except 
  332. // those from the config dialog
  333. // Fills globals with settings under [<drivename>.drv], HUE, SAT, INPUT
  334. //
  335. WORD FAR PASCAL ConfigGetSettings( void )
  336. {
  337.     WORD wTemp;
  338.  
  339.     wTemp = GetPrivateProfileInt(gszDriverName, gszHueKey, 
  340.                 CT_DEFAULT_HUE, gszIniFile);
  341.     gwHue = LimitRange (wTemp, 0, CT_MAX_HUE);
  342.     
  343.     wTemp = GetPrivateProfileInt(gszDriverName, gszSatKey, 
  344.                 CT_DEFAULT_SAT, gszIniFile);
  345.     gwSat = LimitRange (wTemp, 0, CT_MAX_SAT);
  346.  
  347.     wTemp = GetPrivateProfileInt(gszDriverName, gszBrightnessKey, 
  348.                 CT_DEFAULT_BRIGHTNESS, gszIniFile);
  349.     gwBrightness = LimitRange (wTemp, 0, CT_MAX_BRIGHTNESS);
  350.  
  351.     wTemp = GetPrivateProfileInt(gszDriverName, gszContrastKey, 
  352.                 CT_DEFAULT_CONTRAST, gszIniFile);
  353.     gwContrast = LimitRange (wTemp, 0, CT_MAX_CONTRAST);
  354.  
  355.     wTemp = GetPrivateProfileInt(gszDriverName, gszRedKey, 
  356.                 CT_DEFAULT_RED, gszIniFile);
  357.     gwRed = LimitRange (wTemp, 0, CT_MAX_RED);
  358.  
  359.     wTemp = GetPrivateProfileInt(gszDriverName, gszGreenKey, 
  360.                 CT_DEFAULT_GREEN, gszIniFile);
  361.     gwGreen = LimitRange (wTemp, 0, CT_MAX_GREEN);
  362.  
  363.     wTemp = GetPrivateProfileInt(gszDriverName, gszBlueKey, 
  364.                 CT_DEFAULT_BLUE, gszIniFile);
  365.     gwBlue = LimitRange (wTemp, 0, CT_MAX_BLUE);
  366.  
  367.     wTemp = GetPrivateProfileInt(gszDriverName, gszInputChannelKey, 
  368.                 CT_DEFAULT_INPUT, gszIniFile);
  369.     gwSourceConnector = LimitRange (wTemp, 0, CT_SOURCE2);
  370.  
  371.     wTemp = GetPrivateProfileInt(gszDriverName, gszVideoStandardKey, 
  372.                 CT_DEFAULT_STANDARD, gszIniFile);
  373.     gwVideoStandard = LimitRange (wTemp, 0, 1);
  374.  
  375.     wTemp = GetPrivateProfileInt(gszDriverName, gszVideoCableKey, 
  376.                 0, gszIniFile);
  377.     gwVideoCableFormat = LimitRange (wTemp, 0, 1); // 0=composite, 1=SVideo
  378.  
  379.     wTemp = GetPrivateProfileInt(gszDriverName, gszSize40Key, 
  380.                 4, gszIniFile);
  381.     gwSize40 = LimitRange (wTemp, 1, MAX_SIZE_X_NTSC / 40);
  382.  
  383.     wTemp = GetPrivateProfileInt(gszDriverName, gszVideoFormatKey, 
  384.                 IMAGE_FORMAT_PAL8, gszIniFile);
  385.     gwDestFormat = LimitRange (wTemp, 
  386.                 IMAGE_FORMAT_PAL8, IMAGE_FORMAT_YUV411UNPACKED);
  387.  
  388.     return TRUE;
  389. }
  390.  
  391. //
  392. // Saves all settings to the INI except those controlled by the config dialog
  393. // Saves globals settings under [<drivename>.drv], HUE, SAT, INPUT
  394. //
  395. WORD FAR PASCAL ConfigPutSettings( void )
  396. {
  397.     char buf[40];
  398.  
  399.     wsprintf(buf, gszIntFormat, gwHue);
  400.     WritePrivateProfileString(gszDriverName, gszHueKey, buf, gszIniFile);
  401.  
  402.     wsprintf(buf, gszIntFormat, gwSat);
  403.     WritePrivateProfileString(gszDriverName, gszSatKey, buf, gszIniFile);
  404.  
  405.     wsprintf(buf, gszIntFormat, gwBrightness);
  406.     WritePrivateProfileString(gszDriverName, gszBrightnessKey, buf, gszIniFile);
  407.  
  408.     wsprintf(buf, gszIntFormat, gwContrast);
  409.     WritePrivateProfileString(gszDriverName, gszContrastKey, buf, gszIniFile);
  410.  
  411.     wsprintf(buf, gszIntFormat, gwRed);
  412.     WritePrivateProfileString(gszDriverName, gszRedKey, buf, gszIniFile);
  413.  
  414.     wsprintf(buf, gszIntFormat, gwGreen);
  415.     WritePrivateProfileString(gszDriverName, gszGreenKey, buf, gszIniFile);
  416.  
  417.     wsprintf(buf, gszIntFormat, gwBlue);
  418.     WritePrivateProfileString(gszDriverName, gszBlueKey, buf, gszIniFile);
  419.  
  420.     wsprintf(buf, gszIntFormat, gwSourceConnector);
  421.     WritePrivateProfileString(gszDriverName, gszInputChannelKey, buf, gszIniFile);
  422.  
  423.     wsprintf(buf, gszIntFormat, gwVideoStandard);
  424.     WritePrivateProfileString(gszDriverName, gszVideoStandardKey, buf, gszIniFile);
  425.  
  426.     wsprintf(buf, gszIntFormat, gwVideoCableFormat);
  427.     WritePrivateProfileString(gszDriverName, gszVideoCableKey, buf, gszIniFile);
  428.  
  429.     wsprintf(buf, gszIntFormat, gwSize40);
  430.     WritePrivateProfileString(gszDriverName, gszSize40Key, buf, gszIniFile);
  431.  
  432.     wsprintf(buf, gszIntFormat, gwDestFormat);
  433.     WritePrivateProfileString(gszDriverName, gszVideoFormatKey, buf, gszIniFile);
  434.  
  435.     return TRUE;
  436. }
  437.  
  438.  
  439. static void WINAPI ConfigErrorMsgBox( HWND hDlg, WORD wStringId )
  440. {
  441.     char    szPname[MAXPNAMELEN];
  442.     char    szErrorBuffer[MAX_ERR_STRING]; // buffer for error messages
  443.  
  444.     LoadString(ghModule, IDS_VCAPPRODUCT, szPname, MAXPNAMELEN);
  445.     LoadString(ghModule, wStringId, szErrorBuffer, sizeof(szErrorBuffer));
  446.     MessageBox(hDlg, szErrorBuffer, szPname, MB_OK|MB_ICONEXCLAMATION);
  447. }
  448.  
  449.  
  450. void WINAPI ConfigRemove( void )
  451. {
  452.     WritePrivateProfileString(gszDriverName, NULL, NULL, gszIniFile);
  453. }
  454.  
  455. //
  456. // Loads entries into a combobox, and selects the current index
  457. // Parmameters:
  458. //      hWnd of the parent dialog box
  459. //      ID of the combobox
  460. //      array of text and values
  461. //      Count of entries in the COMBOBOX_ENTRY array
  462. //      Initial value which should match the wValue field of the 
  463. //              COMBOBOX_ENTRY.  If no values match, the selection
  464. //              defaults to the first entry in the combobox.
  465. // Returns:
  466. //      Returns the index of the selected item in the combobox.
  467. //
  468. static int WINAPI ConfigLoadComboBox(HWND hDlg, int wID,
  469.        COMBOBOX_ENTRY  * pCBE, int nEntries, WORD wInitialValue)
  470. {
  471.     int j;
  472.     int nIndex = 0;     // Zeroeth entry should be blank, None, etc.
  473.     HWND hWndCB = GetDlgItem (hDlg, wID);
  474.  
  475.     for (j = 0; j < nEntries; j++) {
  476.         SendMessage (hWndCB, CB_ADDSTRING, 0, (LONG) (LPSTR) ((pCBE+j)->szText));
  477.         if (pCBE[j].wValue == wInitialValue)
  478.             nIndex = j;
  479.     }
  480.     SendMessage (hWndCB, CB_SETCURSEL, nIndex, 0L);
  481.     return nIndex;
  482. }
  483.  
  484. //
  485. // Returns the value associated with the selected ComboBox text string.
  486. // Parameters:
  487. //      hWnd of the parent dialog box
  488. //      ID of the ComboBox
  489. //      array of text and values
  490. //  Returns:
  491. //      Returns the value of the selected item in list.
  492. //
  493. static WORD WINAPI ConfigGetComboBoxValue (HWND hDlg, int wID,
  494.        COMBOBOX_ENTRY  * pCBE)
  495. {
  496.     int nIndex;
  497.     HWND hWndCB = GetDlgItem (hDlg, wID);
  498.  
  499.     nIndex = (int) SendMessage (hWndCB, CB_GETCURSEL, 0, 0L);
  500.     nIndex = max (0, nIndex);   // LB_ERR is negative
  501.     return pCBE[nIndex].wValue;
  502. }
  503.  
  504.  
  505. //
  506. // Checks that a value passed matches an entry in a COMBOBOX_ENTRY list.
  507. // Parameters:
  508. //      array of text and values
  509. //      Count of entries in the COMBOBOX_ENTRY array
  510. //      Value to confirm matches an entry in the
  511. //              value field of the COMBOBOX_ENTRY.  
  512. // Returns:
  513. //      Returns wValueToTest if a match is found, otherwise -1.
  514. //
  515. static WORD WINAPI ConfigConfirmLegalValue (COMBOBOX_ENTRY  * pCBE,
  516.         int nEntries, WORD wValueToTest)
  517. {
  518.     int j;
  519.  
  520.     for (j = 0; j < nEntries; j++) 
  521.         if (wValueToTest == pCBE[j].wValue)
  522.             return wValueToTest;
  523.     return -1;
  524. }
  525.  
  526. //
  527. // Checks that all values passed in the DEVICE_INIT structure are legal.
  528. // Returns TRUE if all are OK, FALSE if any are out of range.
  529. //
  530. BOOL FAR PASCAL ConfigCheckAllDeviceInitParms (LPDEVICE_INIT lpDI)
  531. {
  532.     if (ConfigConfirmLegalValue (gwInterruptOptions, N_INTERRUPTOPTIONS,
  533.                 lpDI->bInterrupt) == -1)
  534.         return FALSE;
  535.     if (ConfigConfirmLegalValue (gwMemoryBaseOptions, N_MEMORYBASEOPTIONS,
  536.                 lpDI->wSegment) == -1)
  537.         return FALSE;
  538.  
  539.     return TRUE;     
  540. }
  541.  
  542. //
  543. // Puts up the configuration dialog box.
  544. // Returns whatever was returned from the dialog box procedure.
  545. //
  546. int WINAPI Config(HWND hWnd, HANDLE hModule)
  547. {
  548.     return DialogBox(hModule, MAKEINTATOM(DLG_VIDEOCONFIG), hWnd, (FARPROC)ConfigDlgProc);
  549. }
  550.  
  551. //
  552. // Configuration dialog displayed by the drivers applet
  553. //
  554. // Returns DRVCNF_RESTART if the user has changed settings, which will
  555. //     cause the drivers applet which launched this to give the user a
  556. //     message about having to restart Windows for the changes to take
  557. //     effect.  If the user clicks on "Cancel" or if no settings have changed,
  558. //     DRVCNF_CANCEL is returned.
  559. //
  560. int FAR PASCAL _loadds ConfigDlgProc(HWND hDlg, WORD msg, WORD wParam, LONG lParam)
  561. {
  562.     DEVICE_INIT devInit;         // structure to hold IO Addx, Interrupt, MemBase
  563.     DEVICE_INIT devInit2;
  564.  
  565.     switch (msg)
  566.     {
  567.         case WM_INITDIALOG:
  568.         {
  569.             LPSTR   lpVersion;       
  570.             WORD    wVersionLen;
  571.             BOOL    bRetCode;
  572.             char    szGetName[_MAX_PATH];
  573.             DWORD dwVerInfoSize;
  574.             DWORD dwVerHnd;
  575.             char szBuf[_MAX_PATH];
  576.  
  577.             // All this junk just to get the version???
  578.             GetModuleFileName (ghModule, szBuf, sizeof (szBuf));
  579.  
  580.             // You must fine the file size first before getting any file info
  581.             dwVerInfoSize =
  582.                 GetFileVersionInfoSize(szBuf, &dwVerHnd);
  583.  
  584.             if (dwVerInfoSize) {
  585.                 LPSTR   lpstrVffInfo;             // Pointer to block to hold info
  586.                 HANDLE  hMem;                     // handle to mem alloc'ed
  587.  
  588.                 // Get a block big enough to hold version info
  589.                 hMem          = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
  590.                 lpstrVffInfo  = GlobalLock(hMem);
  591.  
  592.                 // Get the File Version first
  593.                 if(GetFileVersionInfo(szBuf, 0L, dwVerInfoSize, lpstrVffInfo)) {
  594.                      VS_VERSION FAR *pVerInfo = (VS_VERSION FAR *) lpstrVffInfo;
  595.  
  596.                      // fill in the file version                                    
  597.                      wsprintf(szBuf,
  598.                               "Version:  %d.%d.%d.%d", 
  599.                               HIWORD(pVerInfo->vffInfo.dwFileVersionMS),
  600.                               LOWORD(pVerInfo->vffInfo.dwFileVersionMS),
  601.                               HIWORD(pVerInfo->vffInfo.dwFileVersionLS),
  602.                               LOWORD(pVerInfo->vffInfo.dwFileVersionLS));
  603.                      SetDlgItemText(hDlg, ID_DRIVERVERSION, szBuf);
  604.                 }
  605.  
  606.                 // Now try to get the FileDescription
  607.                 // Do this the American english translation be default.  
  608.                 // Keep track of the string length for easy updating.  
  609.                 // 040904E4 represents the language ID and the four 
  610.                 // least significant digits represent the codepage for 
  611.                 // which the data is formatted.  The language ID is 
  612.                 // composed of two parts: the low ten bits represent 
  613.                 // the major language and the high six bits represent 
  614.                 // the sub language.
  615.  
  616.                 lstrcpy(szGetName, "\\StringFileInfo\\040904E4\\FileDescription");
  617.  
  618.                 wVersionLen   = 0;
  619.                 lpVersion     = NULL;
  620.  
  621.                 // Look for the corresponding string. 
  622.                 bRetCode      =  VerQueryValue((LPVOID)lpstrVffInfo,
  623.                             (LPSTR)szGetName,
  624.                             (void FAR* FAR*)&lpVersion,
  625.                             (UINT FAR *) &wVersionLen);
  626.  
  627.                 if ( bRetCode && wVersionLen && lpVersion)
  628.                    SetDlgItemText(hDlg, ID_FILEDESCRIPTION, lpVersion);
  629.  
  630.                 // Let go of the memory
  631.                 GlobalUnlock(hMem);
  632.                 GlobalFree(hMem);
  633.             }
  634.  
  635.             GetHardwareSettingsFromINI (&devInit);
  636.  
  637.             ConfigLoadComboBox (hDlg, ID_LBINTERRUPTNUMBER,
  638.                 gwInterruptOptions, N_INTERRUPTOPTIONS,
  639.                 (WORD) devInit.bInterrupt);
  640.             ConfigLoadComboBox (hDlg, ID_LBMEMORYBASEADDRESS,
  641.                 gwMemoryBaseOptions, N_MEMORYBASEOPTIONS,
  642.                 devInit.wSegment);
  643.             // Total VBlaster hack.  Stuff the current values into array.
  644. #if _VBLASTER
  645.             gwPortBaseOptions[0].wValue = devInit.wIOBase;
  646.             wsprintf (gwPortBaseOptions[0].szText, "0x%X", devInit.wIOBase);
  647. #endif
  648.             ConfigLoadComboBox (hDlg, ID_LBPORTBASEADDRESS,
  649.                 gwPortBaseOptions, N_PORTBASEOPTIONS, 
  650.                 devInit.wIOBase);
  651.         }
  652.         break;
  653.  
  654.         // User will unload this module at exit time, so make
  655.         // sure that the dialog is gone if the user just quits 
  656.         // Windows with the dialog box up.
  657.         case WM_ENDSESSION:     
  658.             if (wParam)
  659.                 EndDialog (hDlg, DRV_CANCEL);
  660.             break;
  661.  
  662.         case WM_COMMAND:
  663.             switch (wParam)
  664.             {
  665.                 case IDOK:
  666.                     devInit.wIOBase = ConfigGetComboBoxValue (hDlg, ID_LBPORTBASEADDRESS,
  667.                         gwPortBaseOptions);
  668.                     devInit.bInterrupt = (BYTE) ConfigGetComboBoxValue (hDlg, ID_LBINTERRUPTNUMBER,
  669.                         gwInterruptOptions);
  670.                     devInit.wSegment = ConfigGetComboBoxValue (hDlg, ID_LBMEMORYBASEADDRESS,
  671.                         gwMemoryBaseOptions);
  672.  
  673.                     if (!(InitVerifyConfiguration( &devInit)))
  674.                     {
  675.                         ConfigErrorMsgBox(hDlg, IDS_ERRBADCONFIG);
  676.                         break;
  677.                     }
  678.                     // Get the original again to see if anything changed
  679.                     GetHardwareSettingsFromINI (&devInit2);
  680.                     PutHardwareSettingsToINI( &devInit);
  681.  
  682.                     // Ask for a restart if anything serious changed
  683.                     // and the driver was already in use...
  684.                     // Note that an open for config only doesn't bump
  685.                     // the usage count
  686.                     if ((gwDriverUsage != 0) && 
  687.                         ((devInit.wIOBase != devInit2.wIOBase) ||
  688.                          (devInit.bInterrupt != devInit2.bInterrupt) ||
  689.                          (devInit.wSegment != devInit2.wSegment) 
  690.                         ))
  691.                         EndDialog(hDlg, DRV_RESTART);
  692.                     else
  693.                         EndDialog(hDlg, DRV_CANCEL);
  694.                     break;
  695.  
  696.                 case IDCANCEL:
  697.                     EndDialog(hDlg, DRV_CANCEL);
  698.                     break;
  699.  
  700.                 default:
  701.                     break;
  702.             }
  703.             break;
  704.       
  705.         default:
  706.            return FALSE;
  707.     }
  708.     return TRUE;
  709. }
  710.  
  711.  
  712. VOID UpdateSizeDisplay (HWND hDlg)
  713. {
  714.     SendDlgItemMessage (hDlg, ID_LBSIZE, CB_SETCURSEL, wTmpSize40 - 1, 0L);
  715. }
  716.  
  717. //
  718. // Dialog proc for the video format dialog box (VIDEO_IN channel)
  719. //
  720. int FAR PASCAL _loadds VideoFormatDlgProc(HWND hDlg, WORD msg, WORD wParam, LONG lParam)
  721. {
  722.     int j;
  723.     BITMAPINFOHEADER bi;
  724.  
  725.     switch (msg)
  726.     {
  727.         case WM_INITDIALOG:
  728.         wTmpVideoFormat = gwDestFormat;
  729.             wTmpSize40 = gwSize40;
  730.             ConfigLoadComboBox( hDlg, ID_LBSIZE,
  731.                 gwSizeOptions, N_SIZEOPTIONS, 
  732.                 wTmpSize40);
  733.  
  734.             ConfigLoadComboBox( hDlg, ID_LBIMAGEFORMAT,
  735.                 gwFormatOptions, N_FORMATOPTIONS, 
  736.                 gwDestFormat);
  737.             UpdateSizeDisplay (hDlg);
  738.             break;
  739.  
  740.         // User will unload this module at exit time, so make
  741.         // sure that the dialog is gone if the user just quits 
  742.         // Windows with the dialog box up.
  743.         case WM_ENDSESSION:     
  744.             if (wParam)
  745.                 EndDialog (hDlg, IDCANCEL);
  746.             break;
  747.  
  748.         case WM_COMMAND:
  749.             switch (wParam)
  750.             {
  751.                 case IDOK:
  752.                     gwSize40 = wTmpSize40;
  753.                     j = ConfigGetComboBoxValue(hDlg,
  754.                 ID_LBIMAGEFORMAT,
  755.                 gwFormatOptions);
  756.  
  757.                     InitDestBIHeader (&bi, j,  gwSize40 * 40);
  758.                     SetDestFormat (&bi, sizeof (bi));
  759.  
  760.                     ConfigPutSettings();    // Save settings
  761.                     EndDialog(hDlg, IDOK);
  762.                     break;
  763.  
  764.                 case IDCANCEL:
  765.                     EndDialog(hDlg, IDCANCEL);
  766.                     break;
  767.  
  768.                 case ID_PBSIZEFULL:
  769.             wTmpSize40 = (MAX_SIZE_X_NTSC / 40);
  770.                     UpdateSizeDisplay (hDlg);
  771.                     break;
  772.  
  773.                 case ID_PBSIZEHALF:
  774.             wTmpSize40 = (MAX_SIZE_X_NTSC / 40) / 2;
  775.                     UpdateSizeDisplay (hDlg);
  776.                     break;
  777.  
  778.                 case ID_PBSIZEQUARTER:
  779.             wTmpSize40 = (MAX_SIZE_X_NTSC / 40) / 4;
  780.                     UpdateSizeDisplay (hDlg);
  781.                     break;
  782.  
  783.                 case ID_PBSIZEEIGHTH:
  784.             wTmpSize40 = (MAX_SIZE_X_NTSC / 40) / 8;
  785.                     UpdateSizeDisplay (hDlg);
  786.                     break;
  787.  
  788.                 case ID_LBSIZE:
  789.                     if (HIWORD (lParam) == CBN_KILLFOCUS) {
  790.                         wTmpSize40 = (WORD) SendDlgItemMessage (hDlg, 
  791.                                 ID_LBSIZE, CB_GETCURSEL, 0, 0L) + 1;
  792.                     }
  793.                     break;
  794.  
  795.                 default:
  796.                     break;
  797.             }
  798.             break;
  799.       
  800.         default:
  801.            return FALSE;
  802.     }
  803.     return TRUE;
  804. }
  805.  
  806.  
  807. int ColorProcessScroll (HWND hDlg, HWND hCtl, WORD wParam, DWORD lParam, 
  808.         int iVal, WORD wIDEditBox)
  809. {
  810.     switch (wParam) {
  811.         case SB_LINEDOWN:
  812.            iVal++;
  813.            break;
  814.         case SB_LINEUP: 
  815.            iVal--;
  816.            break;
  817.         case SB_PAGEDOWN:
  818.            iVal += MAX_COLOR_VALUE / 8;
  819.            break;
  820.         case SB_PAGEUP: 
  821.            iVal -= MAX_COLOR_VALUE / 8;
  822.            break;
  823.         case SB_THUMBTRACK:
  824.             iVal = LOWORD (lParam);
  825.             break;
  826.         default:
  827.             break;
  828.      }
  829.      iVal = LimitRange (iVal, 0, MAX_COLOR_VALUE);
  830.      SetScrollPos   ( hCtl, SB_CTL, iVal, TRUE);
  831.      SetDlgItemInt (hDlg, wIDEditBox, iVal, TRUE);
  832.      return iVal;
  833. }
  834.  
  835.  
  836. //
  837. // Dialog proc for the video source dialog box (VIDEO_EXTERNALIN channel)
  838. //
  839. int FAR PASCAL _loadds VideoSourceDlgProc(HWND hDlg, WORD msg, WORD wParam, LONG lParam)
  840. {
  841.     HWND hCtl;
  842.     WORD wID;
  843.     int  j;
  844.  
  845.     switch (msg)
  846.     {
  847.         case WM_INITDIALOG:
  848.         wTmpSourceConnector = gwSourceConnector;
  849.             wTmpVideoStandard = gwVideoStandard;
  850.             wTmpVideoCableFormat = gwVideoCableFormat;
  851.  
  852.         iTmpHue = gwHue;
  853.             // Disable unused inputs
  854.             for (j = CT_GetVideoChannelCount(); j < 3; j++) {
  855.                 EnableWindow (GetDlgItem (hDlg, 
  856.                         ID_PBSOURCE0 + j), FALSE);
  857.             }
  858.  
  859.             EnableWindow (GetDlgItem (hDlg, ID_PBSVIDEO), 
  860.                 CT_HasSVideo () );
  861.  
  862.             // Hue
  863.             hCtl = GetDlgItem (hDlg, ID_SBHUE);
  864.             SetScrollRange ( hCtl, SB_CTL, 0, CT_MAX_HUE, FALSE);
  865.  
  866.             // Intentional fall through
  867.  
  868.         case WM_UPDATEDIALOG:
  869.             CT_SetVideoSource (wTmpSourceConnector);
  870.             CheckRadioButton( hDlg, ID_PBSOURCE0, ID_PBSOURCE2, 
  871.                 ID_PBSOURCE0 + wTmpSourceConnector);
  872.  
  873.             CT_SetVideoStandard (wTmpVideoStandard);
  874.             CheckRadioButton( hDlg, ID_PBNTSC, ID_PBPAL, 
  875.                 ID_PBNTSC + wTmpVideoStandard);
  876.  
  877.             CT_SetVideoCableFormat (wTmpVideoCableFormat);
  878.             CheckRadioButton( hDlg, ID_PBCOMPOSITE, ID_PBSVIDEO, 
  879.                 ID_PBCOMPOSITE + wTmpVideoCableFormat);
  880.  
  881.             // Hue
  882.             hCtl = GetDlgItem (hDlg, ID_SBHUE);
  883.             SetScrollPos   ( hCtl, SB_CTL, iTmpHue, TRUE);
  884.             SetDlgItemInt (hDlg, ID_EBHUE, iTmpHue, FALSE);
  885.             break;
  886.  
  887.  
  888.         // User will unload this module at exit time, so make
  889.         // sure that the dialog is gone if the user just quits 
  890.         // Windows with the dialog box up.
  891.         case WM_ENDSESSION:     
  892.             if (wParam)
  893.                 EndDialog (hDlg, IDCANCEL);
  894.             break;
  895.  
  896.         case WM_HSCROLL:
  897.             hCtl = HIWORD (lParam);
  898.             wID = GetWindowWord (hCtl, GWW_ID);
  899.             switch (wID) {
  900.                 case ID_SBHUE:
  901.                     iTmpHue = ColorProcessScroll (hDlg, hCtl, wParam, lParam, 
  902.                                 iTmpHue, ID_EBHUE);
  903.                     CT_SetColor (CT_COLOR_HUE, iTmpHue);
  904.                     break;
  905.                 default:
  906.                     break;
  907.             }
  908.             break;
  909.         
  910.         case WM_COMMAND:
  911.             switch (wParam)
  912.             {
  913.                 case IDOK:
  914.             gwHue = iTmpHue;
  915.             gwSourceConnector = wTmpSourceConnector;
  916.             gwVideoStandard = wTmpVideoStandard;
  917.             gwVideoCableFormat = wTmpVideoCableFormat;
  918.                     ConfigPutSettings();    // Save settings
  919.                     EndDialog(hDlg, IDOK);
  920.                     break;
  921.  
  922.                 case IDCANCEL:
  923.                     // Fix, restore all values
  924.                     CT_SetColor (CT_COLOR_HUE, gwHue);
  925.                     CT_SetVideoSource (gwSourceConnector);
  926.                     CT_SetVideoStandard (gwVideoStandard);
  927.                     EndDialog(hDlg, IDCANCEL);
  928.                     break;
  929.  
  930.                 case ID_PBDEFAULT:
  931.                 iTmpHue = CT_DEFAULT_HUE;
  932.                 wTmpSourceConnector = CT_DEFAULT_INPUT;
  933.                     wTmpVideoStandard = CT_DEFAULT_STANDARD;
  934.                     wTmpVideoCableFormat = 0;
  935.  
  936.                     CT_SetColor (CT_COLOR_HUE, iTmpHue);
  937.                     CT_SetVideoSource (wTmpSourceConnector);
  938.                     CT_SetVideoStandard (wTmpVideoStandard);
  939.                     CT_SetVideoCableFormat (wTmpVideoCableFormat);
  940.  
  941.                     SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  942.                     break;
  943.  
  944.                 case ID_PBSOURCE0:
  945.                 case ID_PBSOURCE1:
  946.                 case ID_PBSOURCE2:
  947.             wTmpSourceConnector = wParam - ID_PBSOURCE0;
  948.                     SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  949.                     break;
  950.  
  951.                 case ID_PBNTSC:
  952.                 case ID_PBPAL:
  953.             wTmpVideoStandard = wParam - ID_PBNTSC;
  954.                     SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  955.                     break;
  956.  
  957.                 case ID_PBCOMPOSITE:
  958.                 case ID_PBSVIDEO:
  959.             wTmpVideoCableFormat = wParam - ID_PBCOMPOSITE;
  960.                     SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  961.                     break;
  962.  
  963.                 case ID_EBHUE:
  964.                     if (HIWORD (lParam) == EN_KILLFOCUS) {
  965.                         iTmpHue = GetDlgItemInt (hDlg, ID_EBHUE, NULL, FALSE);
  966.                         iTmpHue = LimitRange (iTmpHue, 0, CT_MAX_HUE);
  967.                         SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  968.                     }    
  969.                     break;
  970.  
  971.                 default:
  972.                     break;
  973.             }
  974.             break;
  975.       
  976.         default:
  977.            return FALSE;
  978.     }
  979.  
  980.     return TRUE;
  981. }
  982.  
  983. //
  984. // Dialog proc for the video monitor (VIDEO_EXTERNALOUT channel)
  985. //
  986. int FAR PASCAL _loadds VideoMonitorDlgProc(HWND hDlg, WORD msg, WORD wParam, LONG lParam)
  987. {
  988.     HWND hCtl;
  989.     WORD wID;
  990.  
  991.     switch (msg)
  992.     {
  993.         case WM_INITDIALOG:
  994.         iTmpSat = gwSat;
  995.             iTmpBrightness = gwBrightness;
  996.         iTmpContrast = gwContrast;
  997.             iTmpRed = gwRed;
  998.             iTmpGreen = gwGreen;
  999.             iTmpBlue = gwBlue;
  1000.             // Intentional fall through
  1001.  
  1002.         case WM_UPDATEDIALOG:
  1003.  
  1004.             // Sat
  1005.             hCtl = GetDlgItem (hDlg, ID_SBSAT);
  1006.             SetScrollRange ( hCtl, SB_CTL, 0, CT_MAX_SAT, FALSE);
  1007.             SetScrollPos   ( hCtl, SB_CTL, iTmpSat, TRUE);
  1008.             SetDlgItemInt (hDlg, ID_EBSAT, iTmpSat, FALSE);
  1009.             CT_SetColor (CT_COLOR_SAT, iTmpSat);
  1010.  
  1011.             // Brightness
  1012.             hCtl = GetDlgItem (hDlg, ID_SBBRIGHTNESS);
  1013.             SetScrollRange ( hCtl, SB_CTL, 0, CT_MAX_BRIGHTNESS, FALSE);
  1014.             SetScrollPos   ( hCtl, SB_CTL, iTmpBrightness, TRUE);
  1015.             SetDlgItemInt (hDlg, ID_EBBRIGHTNESS, iTmpBrightness, FALSE);
  1016.             CT_SetColor (CT_COLOR_BRIGHTNESS, iTmpBrightness);
  1017.  
  1018.             // Contrast
  1019.             hCtl = GetDlgItem (hDlg, ID_SBCONTRAST);
  1020.             SetScrollRange ( hCtl, SB_CTL, 0, CT_MAX_CONTRAST, FALSE);
  1021.             SetScrollPos   ( hCtl, SB_CTL, iTmpContrast, TRUE);
  1022.             SetDlgItemInt (hDlg, ID_EBCONTRAST, iTmpContrast, FALSE);
  1023.             CT_SetColor (CT_COLOR_CONTRAST, iTmpContrast);
  1024.  
  1025.             // Red
  1026.             hCtl = GetDlgItem (hDlg, ID_SBRED);
  1027.             SetScrollRange ( hCtl, SB_CTL, 0, CT_MAX_RED, FALSE);
  1028.             SetScrollPos   ( hCtl, SB_CTL, iTmpRed, TRUE);
  1029.             SetDlgItemInt (hDlg, ID_EBRED, iTmpRed, FALSE);
  1030.             CT_SetColor (CT_COLOR_RED, iTmpRed);
  1031.  
  1032.             // Green
  1033.             hCtl = GetDlgItem (hDlg, ID_SBGREEN);
  1034.             SetScrollRange ( hCtl, SB_CTL, 0, CT_MAX_GREEN, FALSE);
  1035.             SetScrollPos   ( hCtl, SB_CTL, iTmpGreen, TRUE);
  1036.             SetDlgItemInt (hDlg, ID_EBGREEN, iTmpGreen, FALSE);
  1037.             CT_SetColor (CT_COLOR_GREEN, iTmpGreen);
  1038.  
  1039.             // Blue
  1040.             hCtl = GetDlgItem (hDlg, ID_SBBLUE);
  1041.             SetScrollRange ( hCtl, SB_CTL, 0, CT_MAX_BLUE, FALSE);
  1042.             SetScrollPos   ( hCtl, SB_CTL, iTmpBlue, TRUE);
  1043.             SetDlgItemInt (hDlg, ID_EBBLUE, iTmpBlue, FALSE);
  1044.             CT_SetColor (CT_COLOR_BLUE, iTmpBlue);
  1045.             break;
  1046.  
  1047.  
  1048.         case WM_HSCROLL:
  1049.             hCtl = HIWORD (lParam);
  1050.             wID = GetWindowWord (hCtl, GWW_ID);
  1051.             switch (wID) {
  1052.                 case ID_SBSAT:
  1053.                     iTmpSat = ColorProcessScroll (hDlg, hCtl, wParam, lParam, 
  1054.                                 iTmpSat, ID_EBSAT);
  1055.                     CT_SetColor (CT_COLOR_SAT, iTmpSat);
  1056.                     break;
  1057.                 case ID_SBBRIGHTNESS:
  1058.                     iTmpBrightness = ColorProcessScroll (hDlg, hCtl, wParam, lParam, 
  1059.                                 iTmpBrightness, ID_EBBRIGHTNESS);
  1060.                     CT_SetColor (CT_COLOR_BRIGHTNESS, iTmpBrightness);
  1061.                     break;
  1062.                 case ID_SBCONTRAST:
  1063.                     iTmpContrast = ColorProcessScroll (hDlg, hCtl, wParam, lParam, 
  1064.                                 iTmpContrast, ID_EBCONTRAST);
  1065.                     CT_SetColor (CT_COLOR_CONTRAST, iTmpContrast);
  1066.                     break;
  1067.                 case ID_SBRED:
  1068.                     iTmpRed = ColorProcessScroll (hDlg, hCtl, wParam, lParam, 
  1069.                                 iTmpRed, ID_EBRED);
  1070.                     CT_SetColor (CT_COLOR_RED, iTmpRed);
  1071.                     break;
  1072.                 case ID_SBGREEN:
  1073.                     iTmpGreen = ColorProcessScroll (hDlg, hCtl, wParam, lParam, 
  1074.                                 iTmpGreen, ID_EBGREEN);
  1075.                     CT_SetColor (CT_COLOR_GREEN, iTmpGreen);
  1076.                     break;
  1077.                 case ID_SBBLUE:
  1078.                     iTmpBlue = ColorProcessScroll (hDlg, hCtl, wParam, lParam, 
  1079.                                 iTmpBlue, ID_EBBLUE);
  1080.                     CT_SetColor (CT_COLOR_BLUE, iTmpBlue);
  1081.                     break;
  1082.             }
  1083.             break;
  1084.         
  1085.         // User will unload this module at exit time, so make
  1086.         // sure that the dialog is gone if the user just quits 
  1087.         // Windows with the dialog box up.
  1088.         case WM_ENDSESSION:     
  1089.             if (wParam)
  1090.                 EndDialog (hDlg, IDCANCEL);
  1091.             break;
  1092.  
  1093.         case WM_COMMAND:
  1094.             switch (wParam)
  1095.             {
  1096.                 case IDOK:
  1097.             gwSat = iTmpSat;
  1098.             gwContrast = iTmpContrast;
  1099.                     gwBrightness = iTmpBrightness;
  1100.                     gwRed = iTmpRed;
  1101.                     gwGreen = iTmpGreen;
  1102.                     gwBlue = iTmpBlue;
  1103.                     ConfigPutSettings();    // Save settings
  1104.                     EndDialog(hDlg, IDOK);
  1105.                     break;
  1106.  
  1107.                 case IDCANCEL:
  1108.                     // Fix, restore all values
  1109.                     CT_SetColor (CT_COLOR_SAT, gwSat);
  1110.                     CT_SetColor (CT_COLOR_BRIGHTNESS, gwBrightness);
  1111.                     CT_SetColor (CT_COLOR_CONTRAST, gwContrast);
  1112.                     CT_SetColor (CT_COLOR_RED, gwRed);
  1113.                     CT_SetColor (CT_COLOR_GREEN, gwGreen);
  1114.                     CT_SetColor (CT_COLOR_BLUE, gwBlue);
  1115.                     EndDialog(hDlg, IDCANCEL);
  1116.                     break;
  1117.  
  1118.                 case ID_PBDEFAULT:
  1119.                 iTmpSat = CT_DEFAULT_SAT;
  1120.                 iTmpContrast = CT_DEFAULT_CONTRAST;
  1121.                 iTmpBrightness = CT_DEFAULT_BRIGHTNESS;
  1122.                     iTmpRed = CT_DEFAULT_RED;
  1123.                     iTmpGreen = CT_DEFAULT_GREEN;
  1124.                     iTmpBlue = CT_DEFAULT_BLUE;
  1125.  
  1126.                     SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  1127.                     break;
  1128.  
  1129.  
  1130.                 case ID_EBSAT:
  1131.                     if (HIWORD(lParam) == EN_KILLFOCUS) {
  1132.                         iTmpSat = GetDlgItemInt (hDlg, ID_EBSAT, NULL, FALSE);
  1133.                         iTmpSat = LimitRange (iTmpSat, 0, CT_MAX_SAT);
  1134.                         SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  1135.                     }    
  1136.                     break;
  1137.  
  1138.                 case ID_EBBRIGHTNESS:
  1139.                     if (HIWORD(lParam) == EN_KILLFOCUS) {
  1140.                         iTmpBrightness = GetDlgItemInt (hDlg, ID_EBBRIGHTNESS, NULL, FALSE);
  1141.                         iTmpBrightness = LimitRange (iTmpBrightness, 0, CT_MAX_BRIGHTNESS);
  1142.                         SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  1143.                     }    
  1144.                     break;
  1145.  
  1146.                 case ID_EBCONTRAST:
  1147.                     if (HIWORD(lParam) == EN_KILLFOCUS) {
  1148.                         iTmpContrast = GetDlgItemInt (hDlg, ID_EBCONTRAST, NULL, FALSE);
  1149.                         iTmpContrast = LimitRange (iTmpContrast, 0, CT_MAX_CONTRAST);
  1150.                         SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  1151.                     }    
  1152.                     break;
  1153.  
  1154.                 case ID_EBRED:
  1155.                     if (HIWORD(lParam) == EN_KILLFOCUS) {
  1156.                         iTmpRed = GetDlgItemInt (hDlg, ID_EBRED, NULL, FALSE);
  1157.                         iTmpRed = LimitRange (iTmpRed, 0, CT_MAX_RED);
  1158.                         SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  1159.                     }    
  1160.                     break;
  1161.  
  1162.                 case ID_EBGREEN:
  1163.                     if (HIWORD(lParam) == EN_KILLFOCUS) {
  1164.                         iTmpGreen = GetDlgItemInt (hDlg, ID_EBGREEN, NULL, FALSE);
  1165.                         iTmpGreen = LimitRange (iTmpGreen, 0, CT_MAX_GREEN);
  1166.                         SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  1167.                     }    
  1168.                     break;
  1169.  
  1170.                 case ID_EBBLUE:
  1171.                     if (HIWORD(lParam) == EN_KILLFOCUS) {
  1172.                         iTmpBlue = GetDlgItemInt (hDlg, ID_EBBLUE, NULL, FALSE);
  1173.                         iTmpBlue = LimitRange (iTmpBlue, 0, CT_MAX_BLUE);
  1174.                         SendMessage (hDlg, WM_UPDATEDIALOG, 0, 0L);
  1175.                     }    
  1176.                     break;
  1177.  
  1178.  
  1179.                 default:
  1180.                     break;
  1181.             }
  1182.             break;
  1183.       
  1184.         default:
  1185.            return FALSE;
  1186.     }
  1187.  
  1188.     return TRUE;
  1189. }
  1190.  
  1191.